#include "RingQueue.hpp"

// 生产者执行方法
void *Product(void *args)
{

    RingQueue<int> *rq = (RingQueue<int> *)args;
    // 开始生产
    srand((unsigned)time(nullptr));
    while (true)
    {
        int data = rand() % 20 + 1;
        rq->Push(data);
        cout << "生产ID：" << pthread_self() << "生产了一个数据：" << data << endl;
    }
}

// 消费者执行方法
void *Consume(void *args)
{
    RingQueue<int> *rq = (RingQueue<int> *)args;
    // 开始消费
    while (true)
    {
        sleep(1);
        int data = 0;
        rq->Pop(&data);
        cout << "消费者ID:" << pthread_self() << " 消费了一个数据：" << data << endl;
    }
}

int main()
{
    RingQueue<int> *rq = new RingQueue<int>();
    // 创建生产者线程
    pthread_t producter[5];
    for (int i = 0; i < 5; i++)
        pthread_create(producter + i, nullptr, Product, (void *)rq);
    // 创建消费者线程
    pthread_t consumer[5];
    for (int i = 0; i < 5; i++)
        pthread_create(consumer + i, nullptr, Consume, (void *)rq);

    // 等待线程
    for (int i = 0; i < 5; i++)
    {
        pthread_join(producter[i], nullptr);
        pthread_join(consumer[i], nullptr);
    }
    return 0;
}